package it.gat.dao.impl;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import it.gat.dao.AppuntamentoDAO;
import it.gat.dao.ClienteDAO;
import it.gat.dao.RapportoInterventoDAO;
import it.gat.dao.SedeDAO;
import it.gat.dao.TicketDAO;
import it.gat.dao.TipologiaDispositivoDAO;
import it.gat.dao.UtenteDAO;
import it.gat.model.Operatore;
import it.gat.model.StatoTicket;
import it.gat.model.Ticket;
import it.gat.util.dao.MySQLDAOFactory;

public class MySQLTicketDAOImpl implements TicketDAO {

	@Override
	public void insert(Ticket ticket) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query;
		String idOperatore;
		if (ticket.getCreatoDa()!=null)
		{
			idOperatore = "'"+ticket.getCreatoDa().getNomeUtente()+"'";
		}
		else
		{
			idOperatore = "null";
		}
		if (ticket.getSede()!=null)
		{
			query = "INSERT INTO Ticket " +
					"(idCliente,idSede,idTipologiaDispositivo,descrizione,idOperatore,stato) " +
					"VALUES " +
					"("+ticket.getCliente().getIdCliente()+","+
					ticket.getSede().getIdSede()+","+
					ticket.getTipologiaDispositivo().getIdTipologiaDispositivo()+","+
					"'"+ticket.getDescrizione()+"',"+
					idOperatore+","+
					"'"+ticket.getStato()+"')";
		}
		else
		{
			query = "INSERT INTO Ticket " +
					"(idCliente,idTipologiaDispositivo,descrizione,idOperatore,stato) " +
					"VALUES " +
					"("+ticket.getCliente().getIdCliente()+","+
					ticket.getTipologiaDispositivo().getIdTipologiaDispositivo()+","+
					"'"+ticket.getDescrizione()+"',"+
					idOperatore+","+
					"'"+ticket.getStato()+"')";
		}
		stmt.executeUpdate(query);
	}

	@Override
	public Ticket retrieveById(int id) throws SQLException {
		Ticket ticket = new Ticket();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket " + 
				"WHERE IdTicket = " + id;
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			ticket.setIdTicket(id);
			if (rs.getString("idAppuntamento")!=null)
			{
				AppuntamentoDAO appuntamentoDAO = new MySQLAppuntamentoDAOImpl();
				ticket.setAppuntamento(appuntamentoDAO.retriveById(rs.getInt("idAppuntamento")));
			}
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			ticket.setCliente(clienteDAO.retriveById(rs.getInt("idCliente")));
			ticket.setDescrizione(rs.getString("descrizione"));
			UtenteDAO utenteDAO = new MySQLUtenteDAOImpl();
			ticket.setCreatoDa((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idOperatore")));
			if (rs.getString("idRapportoIntervento")!=null)
			{
				RapportoInterventoDAO rapportoInterventoDAO = new MySQLRapportoInterventoDAOImpl();
				ticket.setRapportoIntervento(rapportoInterventoDAO.retrieveById(rs.getInt("idRapportoIntervento")));
			}
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				ticket.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			ticket.setStato(StatoTicket.valueOf(rs.getString("stato")));
			if (rs.getString("idTecnico")!=null)
				ticket.setAssegnatoA((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idTecnico")));
			TipologiaDispositivoDAO tipologiaDispositivoDAO = new MySQLTipologiaDispositivoDAOImpl();
			ticket.setTipologiaDispositivo(tipologiaDispositivoDAO.retriveById(rs.getInt("idTipologiaDispositivo")));
		}
		return ticket;
	}

	@Override
	public List<Ticket> retrieveAll() throws SQLException {
		List<Ticket> tickets = new ArrayList<Ticket>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Ticket ticket = new Ticket();
			ticket.setIdTicket(rs.getInt("idTicket"));
			if (rs.getString("idAppuntamento")!=null)
			{
				AppuntamentoDAO appuntamentoDAO = new MySQLAppuntamentoDAOImpl();
				ticket.setAppuntamento(appuntamentoDAO.retriveById(rs.getInt("idAppuntamento")));
			}
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			ticket.setCliente(clienteDAO.retriveById(rs.getInt("idCliente")));
			ticket.setDescrizione(rs.getString("descrizione"));
			UtenteDAO utenteDAO = new MySQLUtenteDAOImpl();
			ticket.setCreatoDa((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idOperatore")));
			if (rs.getString("idRapportoIntervento")!=null)
			{
				RapportoInterventoDAO rapportoInterventoDAO = new MySQLRapportoInterventoDAOImpl();
				ticket.setRapportoIntervento(rapportoInterventoDAO.retrieveById(rs.getInt("idRapportoIntervento")));
			}
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				ticket.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			ticket.setStato(StatoTicket.valueOf(rs.getString("stato")));
			if (rs.getString("idTecnico")!=null)
				ticket.setAssegnatoA((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idTecnico")));
			TipologiaDispositivoDAO tipologiaDispositivoDAO = new MySQLTipologiaDispositivoDAOImpl();
			ticket.setTipologiaDispositivo(tipologiaDispositivoDAO.retriveById(rs.getInt("idTipologiaDispositivo")));
			tickets.add(ticket);
		}
		return tickets;
	}

	@Override
	public void update(Ticket ticket) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "UPDATE Ticket " +
				"SET idCliente="+ticket.getCliente().getIdCliente()+" ";
		if (ticket.getSede()!=null)
			query+="    ,idSede="+ticket.getSede().getIdSede()+",";
		else
			query+="    ,idSede=null,";
		query+="    idTipologiaDispositivo="+ticket.getTipologiaDispositivo().getIdTipologiaDispositivo()+","+
				"    descrizione='"+ticket.getDescrizione()+"',";
		if (ticket.getCreatoDa()!=null)
			query+="    idOperatore='"+ticket.getCreatoDa().getNomeUtente()+"',";
		query+="    stato='"+ticket.getStato()+"' ";
		if (ticket.getAppuntamento()!=null)
			query+="    ,idAppuntamento="+ticket.getAppuntamento().getIdAppuntamento()+" ";
		if (ticket.getRapportoIntervento()!=null)
			query+="    ,idRapportoIntervento="+ticket.getRapportoIntervento().getIdRapportoIntervento()+" ";
		if (ticket.getAssegnatoA()!=null)
			query+="    ,idTecnico='"+ticket.getAssegnatoA().getNomeUtente()+"' ";
		query+="WHERE idTicket="+ticket.getIdTicket();
		stmt.executeUpdate(query);

	}

	@Override
	public void delete(int idTicket) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "DELETE FROM Ticket " +
				"WHERE idTicket="+idTicket;
		stmt.executeUpdate(query);

	}

	@Override
	public List<Ticket> retrieveTicketsAperti() throws SQLException {
		List<Ticket> tickets = new ArrayList<Ticket>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket "+
				"WHERE stato='"+StatoTicket.APERTO.toString()+"'";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Ticket ticket = new Ticket();
			ticket.setIdTicket(rs.getInt("idTicket"));
			if (rs.getString("idAppuntamento")!=null)
			{
				AppuntamentoDAO appuntamentoDAO = new MySQLAppuntamentoDAOImpl();
				ticket.setAppuntamento(appuntamentoDAO.retriveById(rs.getInt("idAppuntamento")));
			}
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			ticket.setCliente(clienteDAO.retriveById(rs.getInt("idCliente")));
			ticket.setDescrizione(rs.getString("descrizione"));
			UtenteDAO utenteDAO = new MySQLUtenteDAOImpl();
			ticket.setCreatoDa((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idOperatore")));
			if (rs.getString("idRapportoIntervento")!=null)
			{
				RapportoInterventoDAO rapportoInterventoDAO = new MySQLRapportoInterventoDAOImpl();
				ticket.setRapportoIntervento(rapportoInterventoDAO.retrieveById(rs.getInt("idRapportoIntervento")));
			}
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				ticket.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			ticket.setStato(StatoTicket.valueOf(rs.getString("stato")));
			if (rs.getString("idTecnico")!=null)
				ticket.setAssegnatoA((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idTecnico")));
			TipologiaDispositivoDAO tipologiaDispositivoDAO = new MySQLTipologiaDispositivoDAOImpl();
			ticket.setTipologiaDispositivo(tipologiaDispositivoDAO.retriveById(rs.getInt("idTipologiaDispositivo")));
			tickets.add(ticket);
		}
		return tickets;
	}
	
	@Override
	public List<Ticket> retrieveTicketsAssegnati() throws SQLException {
		List<Ticket> tickets = new ArrayList<Ticket>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket "+
				"WHERE stato='"+StatoTicket.ASSEGNATO.toString()+"'";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Ticket ticket = new Ticket();
			ticket.setIdTicket(rs.getInt("idTicket"));
			if (rs.getString("idAppuntamento")!=null)
			{
				AppuntamentoDAO appuntamentoDAO = new MySQLAppuntamentoDAOImpl();
				ticket.setAppuntamento(appuntamentoDAO.retriveById(rs.getInt("idAppuntamento")));
			}
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			ticket.setCliente(clienteDAO.retriveById(rs.getInt("idCliente")));
			ticket.setDescrizione(rs.getString("descrizione"));
			UtenteDAO utenteDAO = new MySQLUtenteDAOImpl();
			ticket.setCreatoDa((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idOperatore")));
			if (rs.getString("idRapportoIntervento")!=null)
			{
				RapportoInterventoDAO rapportoInterventoDAO = new MySQLRapportoInterventoDAOImpl();
				ticket.setRapportoIntervento(rapportoInterventoDAO.retrieveById(rs.getInt("idRapportoIntervento")));
			}
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				ticket.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			ticket.setStato(StatoTicket.valueOf(rs.getString("stato")));
			if (rs.getString("idTecnico")!=null)
				ticket.setAssegnatoA((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idTecnico")));
			TipologiaDispositivoDAO tipologiaDispositivoDAO = new MySQLTipologiaDispositivoDAOImpl();
			ticket.setTipologiaDispositivo(tipologiaDispositivoDAO.retriveById(rs.getInt("idTipologiaDispositivo")));
			tickets.add(ticket);
		}
		return tickets;
	}
	
	@Override
	public List<Ticket> retrieveByIdCliente(int idCliente) throws SQLException {
		List<Ticket> tickets = new ArrayList<Ticket>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket "+
				"WHERE idCliente="+Integer.toString(idCliente);
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Ticket ticket = new Ticket();
			ticket.setIdTicket(rs.getInt("idTicket"));
			if (rs.getString("idAppuntamento")!=null)
			{
				AppuntamentoDAO appuntamentoDAO = new MySQLAppuntamentoDAOImpl();
				ticket.setAppuntamento(appuntamentoDAO.retriveById(rs.getInt("idAppuntamento")));
			}
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			ticket.setCliente(clienteDAO.retriveById(rs.getInt("idCliente")));
			ticket.setDescrizione(rs.getString("descrizione"));
			UtenteDAO utenteDAO = new MySQLUtenteDAOImpl();
			ticket.setCreatoDa((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idOperatore")));
			if (rs.getString("idRapportoIntervento")!=null)
			{
				RapportoInterventoDAO rapportoInterventoDAO = new MySQLRapportoInterventoDAOImpl();
				ticket.setRapportoIntervento(rapportoInterventoDAO.retrieveById(rs.getInt("idRapportoIntervento")));
			}
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				ticket.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			ticket.setStato(StatoTicket.valueOf(rs.getString("stato")));
			if (rs.getString("idTecnico")!=null)
				ticket.setAssegnatoA((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idTecnico")));
			TipologiaDispositivoDAO tipologiaDispositivoDAO = new MySQLTipologiaDispositivoDAOImpl();
			ticket.setTipologiaDispositivo(tipologiaDispositivoDAO.retriveById(rs.getInt("idTipologiaDispositivo")));
			tickets.add(ticket);
		}
		return tickets;
	}
	
	public List<Ticket> retrieveByNomeUtenteTecnico(String nomeUtente)  throws SQLException {
		List<Ticket> tickets = new ArrayList<Ticket>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket "+
				"WHERE idTecnico='"+nomeUtente+"'";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Ticket ticket = new Ticket();
			ticket.setIdTicket(rs.getInt("idTicket"));
			if (rs.getString("idAppuntamento")!=null)
			{
				AppuntamentoDAO appuntamentoDAO = new MySQLAppuntamentoDAOImpl();
				ticket.setAppuntamento(appuntamentoDAO.retriveById(rs.getInt("idAppuntamento")));
			}
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			ticket.setCliente(clienteDAO.retriveById(rs.getInt("idCliente")));
			ticket.setDescrizione(rs.getString("descrizione"));
			UtenteDAO utenteDAO = new MySQLUtenteDAOImpl();
			ticket.setCreatoDa((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idOperatore")));
			if (rs.getString("idRapportoIntervento")!=null)
			{
				RapportoInterventoDAO rapportoInterventoDAO = new MySQLRapportoInterventoDAOImpl();
				ticket.setRapportoIntervento(rapportoInterventoDAO.retrieveById(rs.getInt("idRapportoIntervento")));
			}
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				ticket.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			ticket.setStato(StatoTicket.valueOf(rs.getString("stato")));
			if (rs.getString("idTecnico")!=null)
				ticket.setAssegnatoA((Operatore) utenteDAO.retriveByNomeUtente(rs.getString("idTecnico")));
			TipologiaDispositivoDAO tipologiaDispositivoDAO = new MySQLTipologiaDispositivoDAOImpl();
			ticket.setTipologiaDispositivo(tipologiaDispositivoDAO.retriveById(rs.getInt("idTipologiaDispositivo")));
			tickets.add(ticket);
		}
		return tickets;
	}
	

}
